from django import forms
from django.core.exceptions import ValidationError
from app02 import models

"""
Form 组件用于对页面进行初始化，生成 HTML 标签，此外还可以对用户提交对数据进行校验（显示错误信息）。

报错信息显示顺序：
    先显示字段属性中的错误信息，然后再显示局部钩子的错误信息。
    若显示了字段属性的错误信息，就不会显示局部钩子的错误信息。
    若有全局钩子，则全局钩子是等所有的数据都校验完，才开始进行校验，并且全局钩子的错误信息一定会显示。

"""


class EmpForm(forms.Form):
    """
    字段属性：
        label：输入框前面的文本信息。
        error_message：自定义显示的错误信息，属性值是字典，其中 required 为设置不能为空时显示的错误信息的 key。
    """
    name = forms.CharField(min_length=2, label="姓名",
                           error_messages={"min_length": "用户名太短", "required": "不能为空!"})

    age = forms.IntegerField(label="年龄", error_messages={"required": "不能为空!"})

    # 以下设置总共5位：整数部分3位，小数部分2位
    salary = forms.DecimalField(max_digits=5, decimal_places=2, label="工资",
                                error_messages={"max_digits": "工资超长", "required": "不能为空!"})

    r_salary = forms.DecimalField(max_digits=5, decimal_places=2, label="工资确认",
                                  error_messages={"required": "不能为空!"})

    def clean_name(self):  # 局部钩子
        val = self.cleaned_data.get("name")

        if val.isdigit():
            raise ValidationError("用户名不能是纯数字")
        elif models.Emp.objects.filter(name=val):
            raise ValidationError("用户名已存在！")
        else:
            return val

    def clean(self):  # 全局钩子 确认两次输入的工资是否一致。
        val = self.cleaned_data.get("salary")
        r_val = self.cleaned_data.get("r_salary")

        if val == r_val:
            return self.cleaned_data
        else:
            raise ValidationError("请确认工资是否一致。")
